package com.itheima.d1_ip;

import java.net.InetAddress;

/**
 * 目标：掌握InetAddress类的使用。
 *
 * 什么是网络编程？
 * 可以让设备中的程序与网络上其他设备中的程序进行数据交互（实现网络通信的）。
 * java.net.*包下提供了网络编程的解决方案！
 *
 *基本的通信架构
 * 基本的通信架构有2种形式：CS架构（ Client客户端/Server服务端 ） 、 BS架构(Browser浏览器/Server服务端)。
 *   Client-Server(CS) :
 *   Client客户端:需要程序员开发。用户需要安装。   Server服务端:需要程序员开发实现。
 *   Browser-Server(BS)"
 *   Browser浏览器:不需要程序员开发实现。用户需要安装浏览器。   Server服务端:需要程序员开发实现。
 *
 * 网络通信的关键三要素:IP 端口  协议
 *
 *  IP:
 * 设备在网络中的地址，是唯一的标识。IP（Internet Protocol）：全称”互联网协议地址”，是分配给上网设备的唯一标志。
 *
 * IP地址有两种形式：IPv4、IPv6
 *  IPv4:32bit（4字节），例如11000000 10101000 00000001 01000010   用点分十进制表示法：192.168.1.66，就是用八位（一个字节）转换为十进制
 *  IPv6：共128位，号称可以为地球每一粒沙子编号。
 *  IPv6分成8段表示，每段每四位编码成一个十六进制位表示， 数之间用冒号（：）分开。用冒分十六进制表示法
 *  域名也是一种ip地址，例如当计算机通过域名去访问某个地址的时候，首先会通过电脑中的dns服务器转换为一个IP地址，每个电脑中都有一个本地的DNS服务器
 *  这就是域名解析器，电脑拿到域名解析器给的域名相应的IP地址，去访问相应IP地址的服务器，然后服务器会返回数据展示在浏览器上
 * 端口:应用程序在设备中唯一的标识
 * 协议:连接和数据在网络中传输的规则。
 *
 * 公网IP, 内网IP
 * 公网IP：是可以连接互联网的IP地址；内网IP：也叫局域网IP，只能组织机构内部使用。
 * 192.168. 开头的就是常见的局域网地址，范围即为192.168.0.0--192.168.255.255，专门为组织机构内部使用。
 * 特殊IP地址：
 * 127.0.0.1
 * localhost：代表本机IP，只会寻找当前所在的主机。
 * IP常用命令：
 * ipconfig：查看本机IP地址。
 * ping IP地址：检查网络是否连通。
 *
 * InetAddress：代表IP地址。
 * InetAddress的常用方法如下
 * public static InetAddress getLocalHost()             获取本机IP，会以一个inetAddress的对象返回
 * public static InetAddress getByName (String host)    根据ip地址或者域名，返回一个inetAdress对象
 * public String getHostName()                          获取该ip地址对象对应的主机名
 * public String getHostAddress()                       获取该ip地址对象中的ip地址信息
 * public boolean isReachable(int timeout)              在指定毫秒内，判断主机与该ip对应的主机是否能连通
 *
 *
 * 端口
 * 标记正在计算机设备上运行的应用程序的，被规定为一个 16 位的二进制，范围是 0~65535。
 * 分类
 * 周知端口：0~1023，被预先定义的知名应用占用（如：HTTP占用 80，FTP占用21）
 * 注册端口：1024~49151，分配给用户进程或某些应用程序。
 * 动态端口：49152到65535，之所以称为动态端口，是因为它 一般不固定分配某种进程，而是动态分配。
 * 注意：我们自己开发的程序一般选择使用注册端口，且一个设备中不能出现两个程序的端口号一样，如果一样会出现端口冲突错误
 *
 * 通信协议
 * 网络上通信的设备，事先规定的连接规则，以及传输数据的规则被称为网络通信协议。
 *
 * 开放式网络互联标准：OSI网络参考模型
 * OSI网络参考模型：全球网络互联标准。
 * TCP/IP网络模型：事实上的国际标准。
 *
 * OSI网络参考模型：               各层对应                    面向操作
 * 应用层，表示层，会话层          HTTP、FTP、SMTP…      应用程序需要关注的：浏览器，邮箱。程序员一般在这一层开发
 *       传输层                 UDP、TCP…            选择使用的TCP , UDP协议
 *       网络层                 IP…                  封装源和目标IP
 * 数据链路层，物理层             比特流…               物理设备中传输
 *
 * TCP/IP网络模型：
 *      应用层                 HTTP、FTP、SMTP…      应用程序需要关注的：浏览器，邮箱。程序员一般在这一层开发
 *      传输层                 UDP、TCP…            选择使用的TCP , UDP协议
 *      网络层                 IP…                 封装源和目标IP
 * 数据链路层+ 物理             比特流…               物理设备中传输
 *
 * 传输层的2个通信协议
 * UDP(User Datagram Protocol)：用户数据报协议； TCP(Transmission Control Protocol) ：传输控制协议。
 * UDP协议：
 * 特点：无连接、不可靠通信。通信效率高，适用于语音通话，视频直播
 * 不事先建立连接，数据按照包发，一包数据包含：自己的IP、程序端口，目的地IP、程序端口和数据（限制在64KB内）等。
 * 发送方不管对方是否在线，数据在中间丢失也不管，如果接收方收到数据也不返回确认，故是不可靠的 。
 *
 * TCP协议：
 * 特点：面向连接、可靠通信。通信效率相对不高，适用于网页，文件下载，支付
 * TCP的最终目的：要保证在不可靠的信道上实现可靠的传输。
 * TCP主要有三个步骤实现可靠传输：三次握手建立连接，传输数据进行确认，四次挥手断开连接。
 *
 *TCP协议：三次握手建立可靠连接：
 * 可靠连接：确定通信双方，收发消息都是正常无问题的！（全双工）
 *      客户端发出连接请求，服务器端返回一个响应，客户端再次发出确认信息，连接建立
 *      传输数据会进行确认，以保证数据传输的可靠性
 *
 *TCP协议：四次握手断开连接
 *  目的：确保双方数据的收发都已经完成！
 *      客户端发出断开连接请求，服务器端返回一个响应：稍等，然后服务器将最后的数据处理完毕，返回一个响应：确认断开，客户端发出正式确认断开连接
 *
 * 传输层的2个通信协议
 *      UDP(User Datagram Protocol)：用户数据报协议； TCP(Transmission Control Protocol) ：传输控制协议。
 *
 * 1、通信协议是什么？
 * 计算机网络中，连接和通信数据的规则被称为网络通信协议。
 * 2、TCP通信协议的特点是什么样的?
 * 它是一种面向连接的可靠通信协议。
 * 传输前，采用“三次握手”方式建立连接，点对点的通信，所以可靠。
 * 在连接中可进行大数据量的传输。
 * 通信效率较低。
 * 3、UDP协议的特点是什么
 * 用户数据报协议(User Datagram Protocol)
 * UDP是面向无连接，不可靠传输的通信协议。
 * 速度快，有大小限制一次最多发送64K，数据不安全，易丢失数据。
 *
 */
public class InetAddressTest {
    public static void main(String[] args) throws Exception {
        /*
         * public static InetAddress getLocalHost()             获取本机IP，会以一个inetAddress的对象返回
         * public static InetAddress getByName (String host)    根据ip地址或者域名，返回一个inetAdress对象
         * public String getHostName()                          获取该ip地址对象对应的主机名
         * public String getHostAddress()                       获取该ip地址对象中的ip地址信息
         * public boolean isReachable(int timeout)              在指定毫秒内，判断主机与该ip对应的主机是否能连通
         */
        // 1、获取本机IP地址对象的
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());

        System.out.println("-----------------自己试一试--------------");
        InetAddress zip1 = InetAddress.getLocalHost();
        System.out.println(zip1.getHostName());
        System.out.println(zip1.getHostAddress());

        // 2、获取指定IP或者域名的IP地址对象。
        InetAddress ip2 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());
        System.out.println(ip2.getHostAddress());

        //ip2.isReachable(6000)方法，相当于 ping命令在：ping www.baidu.com
        System.out.println(ip2.isReachable(6000));
    }
}
